#include "DialogAbrirXML.h"
#include <stdexcept>

#include <gtkmm/menuitem.h>
#include <gtkmm/filefilter.h>
#include <gtkmm/messagedialog.h>
#include <gtkmm/stock.h>


DialogAbrirXML::DialogAbrirXML(Glib::RefPtr<Gtk::Builder> b, std::string nomMenuItem,
	Configuraciones** params, Gtk::Window& parentWin)
	: FileChooserDialog(parentWin, "Abrir archivo de configuración", Gtk::FILE_CHOOSER_ACTION_OPEN)
{
	// Agrega los botones al cuadro de dialogo
	this->add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK);
	this->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);

	// Se agregan los filtros para que solo se puedan abrir los archivos XML
	Glib::RefPtr<Gtk::FileFilter> filtro = Gtk::FileFilter::create();
	filtro->set_name("Archivos XML");
	filtro->add_mime_type("text/xml");

	this->add_filter(filtro);

	// Que la ventana de guardar este en el actual directorio
	this->set_current_folder("");

	// Se conecta al menú de abrir archivos
	Gtk::MenuItem* pMenu = 0;
	b->get_widget(nomMenuItem, pMenu);

	if (!pMenu) throw std::runtime_error("No existe el menú de '"+ nomMenuItem +"'");

	pMenu->signal_activate().connect( sigc::mem_fun(*this, &DialogAbrirXML::abrirDialogo) );

	// Donde guarda las configuraciones cargadas
	this->_pConfig = params;
}


DialogAbrirXML::~DialogAbrirXML(){
}


void DialogAbrirXML::abrirDialogo(){
	int resul = this->run();
	this->hide();

	// Si cancela la seleccion no pasa nada
	if (resul == Gtk::RESPONSE_CANCEL) return;

	try {
		// Si ya existe un archivo de configuraciones lo elimino
		if (*this->_pConfig != NULL) delete *this->_pConfig;

		// Parsea el nuevo archivo de configuraciones
		*this->_pConfig = new Configuraciones(this->get_filename());

	} catch (std::runtime_error& rt){
		// Hubo un error al parsear el archivo
		Gtk::MessageDialog md("Error al parsear el archivo de configuraciones");
		md.set_secondary_text("El archivo seleccionado no tenia el formato correcto");
		md.set_transient_for(*this->get_transient_for());

		md.run();
	}
}



